﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace GIFT
{
    class ConsultaLista
    {
        //Constructor de la clase
        public ConsultaLista()
        {
            consulta = new Consulta();
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos
        public bool existe(String nombre)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From lista Where nombre ='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Borrar una Lista
        public void borrar(String nombre)
        {
            String sentenciaSql = "DELETE FROM lista WHERE nombre ='" + nombre + "'";//crea la consulta
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Busca en la base de datos el atributo de la Lista con el nombre que recibe como parametro
        public String buscarAtributo(String nombre, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from lista Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Obtiene de la base de datos todos las Listas existentes, y los retorna en un arreglo
        public ArrayList obtieneListas()
        {
            ArrayList textos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From lista";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    textos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return textos;
        }


        //Guarda en la base de datos una nueva Lista, recibe los valores a introducir 
        public void crear(String nombre, String descripcion, bool orden)
        {
            String ordenada;
            if (orden) { ordenada = "1"; } else { ordenada = "0"; }
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[lista] ([nombre],[descripcion],[fecha_actualizacion],[ordenada]) VALUES ('" + nombre + "','" + descripcion + "',(GetDate()), " + ordenada+ " )";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Guarda en la base de datos un nuevo Termino de la lista, recibe los valores a introducir 
        public void crearTermino(String nombre, String correlativoLista, String orden)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[termino_lista]([nombre],[correlativo lista],[orden]) VALUES ('" + nombre + "', " + correlativoLista + "," + orden + ")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica una lista en la base de datos
        public void modificarLista(String nombre, String descripcion, bool orden)
        {
            String ordenada;
            if (orden) { ordenada = "1"; } else { ordenada = "0"; }
            String sentenciaSql; //va a guardar la consulta a realizar
            SqlDataReader datos; //guarda el ersultado de la consulta
            sentenciaSql = "UPDATE [GIFT].[dbo].[lista] SET descripcion= '" + descripcion + "',fecha_actualizacion = (GetDate()), ordenada = " + ordenada + " WHERE nombre= '" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Devuelve el nombre de un termino de la lista conociendo el id, para conocer el defecto de la lista
        public String obtieneDefectoLista(String defecto) 
        {
            String ret = "";
            SqlDataReader datos;
            String sentenciaSql = "Select nombre from [GIFT].[dbo].[termino_lista] where id = " + defecto ;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
               if(datos.Read())
                {
                    ret = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return ret;
        }

        //Obtiene de la base de datos los terminos relacionados con una lista en particular
        public ArrayList obtieneTerminosLista(String correlativo)
        {
            ArrayList terminos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From termino_lista where [correlativo lista] = " + correlativo + " Order By orden ASC";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    terminos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return terminos;
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos
        public bool existeTermino(String nombre, String correlativo)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From termino_lista Where nombre ='" + nombre + "' AND [correlativo lista] = " + correlativo;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Establece el orden del termino de una lista que recibe como paramentro
        public void estableceOrdenTermino(String termino, String orden, String correlativoLista) 
        {
            String sentenciaSql = "UPDATE [GIFT].[dbo].[termino_lista] SET orden = " + orden + " WHERE [correlativo lista] = " + correlativoLista + " AND nombre = '" + termino + "'";
            SqlDataReader  datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();
        }

        //Establece el orden de la Lista
        public void estableceOrdenLista(bool orden, String correlativo) 
        {
            String ordenada;
            if (orden) { ordenada = "1"; } else { ordenada = "0"; }
            String sentenciaSql = "UPDATE [GIFT].[dbo].[lista] SET ordenada = " + ordenada + " WHERE correlativo = " + correlativo;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();
        }


        //Establece el defecto de la Lista
        public void estableceDefectoLista(String defecto, String correlativo)
        {
            String sentenciaSql = "UPDATE [GIFT].[dbo].[lista] SET defecto = " + defecto + " WHERE correlativo = " + correlativo;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();
        }

        //Eliimina un termino de una lista especifica
        public void eliminaTermino(String termino, String correlativoLista) 
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[termino_lista] WHERE nombre = '" + termino + "' AND [correlativo lista] = " + correlativoLista;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();        
        }

        //Devuelve el ID de un termino de una lista especifica
        public String obtieneIDTermino(String termino, String correlativoLista)
        {
            String ret = "";
            SqlDataReader datos;
            String sentenciaSql = "Select id from [GIFT].[dbo].[termino_lista] where nombre = '" + termino + "' AND [correlativo lista] = " + correlativoLista;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                if (datos.Read())
                {
                    ret = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return ret;
        }

        //Copia los terminos de una lista a otra lista
        public void copiarTerminosLista(String nombreNuevo, String nombreViejo)
        {
            String correlativoNuevo = this.buscarAtributo(nombreNuevo, "correlativo");
            String correlativoViejo = this.buscarAtributo(nombreViejo, "correlativo");
            ArrayList listaTerminosViejo = this.obtieneTerminosLista(correlativoViejo);

            for (int i = 0; i < listaTerminosViejo.Count; ++i) 
            {
                this.crearTermino(listaTerminosViejo[i].ToString(), correlativoNuevo, i.ToString());
            }

        }

        //Busca nombres de as listas que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarConcordancias(String frase)
        {
            ArrayList campos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select T.nombre From lista T Where T.nombre LIKE '%" + frase + "%' OR T.descripcion LIKE '%" + frase + "%'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    campos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return campos;
        }

        //Copia el defecto de una lista en otra
        public void copiarDefecto(String nombreNuevo, String nombreViejo)
        {
            String defectoViejo = this.buscarAtributo(nombreViejo, "defecto");
            if (defectoViejo != "ERROR") 
            {
                String correlativoNuevo = this.buscarAtributo(nombreNuevo, "correlativo");
                String defecto = this.obtieneDefectoLista(defectoViejo);
                String idTermino = this.obtieneIDTermino(defecto, correlativoNuevo);
                this.estableceDefectoLista(idTermino, correlativoNuevo);
            }
        }

        //Modifica un termino de una lista
        public void modificaTermino(String correlativoLista, String nombreViejo, String nombreNuevo)
        {
            String idTermino = this.obtieneIDTermino(nombreViejo, correlativoLista);
            String sentenciaSql = "UPDATE [GIFT].[dbo].[termino_lista] SET nombre = '" + nombreNuevo + "'  WHERE id = " + idTermino;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion(); 
        }


        //Variables globales
        private Consulta consulta;
    }
}
